#ifndef _OTA_API_H_
#define _OTA_API_H_

#include <string.h>
#include <stdint.h>
#include <stdbool.h>

/**
 * @brief 获取引导程序文件总长度
 *
 * @return uint32_t - 引导程序文件总长度
 */
extern uint32_t GetTotalBootloaderFirmwareFileSize(void);

/**
 * @brief 擦除引导程序
 *
 */
extern void EraseBootloaderFirmware(void);

/**
 * @brief 读取引导程序
 *
 * @param ReadAddress - 读取起始地址
 * @param pDataOut    - 返回目标地址数据流
 * @param SizeOut     - 读取数据长度
 * @return uint32_t   - 实际读取数据长度
 */
extern void ReadBootloaderFirmwareData(uint32_t ReadAddress, void *pDataOut, uint32_t SizeOut);

/**
 * @brief 写入引导程序
 *
 * @param WriteAddress - 写入起始地址
 * @param pDataIn      - 待写入的数据
 * @param SizeIn       - 写入数据长度
 * @return bool        - 写入状态（true：成功 false：失败）
 */
extern bool WriteBootloaderFirmwareData(uint32_t WriteAddress, const void *pDataIn, uint32_t SizeIn);

/**
 * @brief 获取固件程序总长度
 *
 * @return uint32_t - 固件总大小
 */
extern uint32_t GetTotalApplicationFirmwareFileSize(void);

/**
 * @brief 擦除用户程序
 *
 */
extern void EraseApplicationFirmware(void);

/**
 * @brief 读取用户程序
 *
 * @param ReadAddress - 读取起始地址
 * @param pDataOut    - 返回目标地址数据流
 * @param SizeOut     - 读取数据长度
 */
extern void ReadApplicationFirmwareData(uint32_t ReadAddress, void *pDataOut, uint32_t SizeOut);

/**
 * @brief 写入用户程序
 *
 * @param WriteAddress - 写入起始地址
 * @param pDataIn      - 待写入的数据
 * @param SizeIn       - 写入数据长度
 * @return bool        - 写入状态（true：成功 false：失败）
 */
extern bool WriteApplicationFirmwareData(uint32_t WriteAddress, const void *pDataIn, uint32_t SizeIn);

/**
 * @brief 获取备份程序文件总长度
 *
 * @return uint32_t - 备份程序文件总长度
 */
extern uint32_t GetTotalBackupBootloaderFirmwareFileSize(void);

/**
 * @brief 擦除备份程序
 *
 */
extern void EraseBackupBootloaderFirmware(void);

/**
 * @brief 读取备份程序
 *
 * @param ReadAddress - 读取起始地址
 * @param pDataOut    - 返回目标地址数据流
 * @param SizeOut     - 读取数据长度
 */
extern void ReadBackupBootloaderFirmwareData(uint32_t ReadAddress, void *pDataOut, uint32_t SizeOut);

/**
 * @brief 写入备份程序
 *
 * @param WriteAddress - 写入起始地址
 * @param pDataIn      - 待写入的数据
 * @param SizeIn       - 写入数据长度
 * @return bool        - 写入状态（true：成功 false：失败）
 */
extern bool WriteBackupBootloaderFirmwareData(uint32_t WriteAddress, const void *pDataIn, uint32_t SizeIn);

/**
 * @brief 获取备份程序校验码
 *
 * @param FileSize  - 待校验文件大小
 * @return uint32_t - 校验码
 */
extern uint32_t GetBackupBootloaderFirmwareCheckCode(uint32_t FileSize);

/**
 * @brief 更新引导程序
 *
 * @return bool - 更新状态（true：成功 false：失败）
 */
extern bool UpdateBackupBootloaderFirmware(void);

#endif
